package wiki.daos;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import wiki.banco.Conexao;
import wiki.beans.Pessoa;

public class PessoaDAO
{
  Conexao conexao;
  
  public PessoaDAO()
  {
    conexao = new Conexao();
  }
  
  protected void finalize()
  {
    conexao.fechar();
  }
  
  public boolean excluir(int idPessoa)
  {
    boolean res = true;
    String query = "DELETE FROM pessoa "
            + "WHERE idPessoa=?";
    conexao.preparar(query);
    try
    {
      conexao.getPstmt().setInt(1, idPessoa);
      res = conexao.executeUpdate();
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    return(res);
  }
  
  public boolean atualizar(Pessoa antiga, Pessoa nova)
  {
     boolean res = true;
     String query = "UPDATE pessoa SET "
             + "nome=?, email=?, senha=?, codCidade=?, codUF WHERE idPessoa=?";
     conexao.preparar(query);
    try
    {
      conexao.getPstmt().setString(1, nova.getNome());
      conexao.getPstmt().setString(2, nova.getEmail());
      conexao.getPstmt().setString(3, nova.getSenha());
      conexao.getPstmt().   setInt(4, nova.getCodCidade().getIdCidade());
      conexao.getPstmt().	setInt(5, antiga.getIdPessoa());
      res = conexao.executeUpdate();
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    return(res);
  }
  
  public boolean inserir(Pessoa p)
  {
    boolean res = true;
    
    String query = "INSERT INTO pessoa "
            + "(nome, email, senha, codCidade) VALUES (?,?,?,?)";
    conexao.preparar(query);
    try
    {
    	PessoaDAO pDAO = new PessoaDAO();
    	
    	if(pDAO.buscarPorEmail(p.getEmail()))
    	{
    		res = false;
    	}
    	else
    	{
    		conexao.getPstmt().setString(1, p.getNome());
    		conexao.getPstmt().setString(2, p.getEmail());
    		conexao.getPstmt().setString(3, p.getSenha());
    		conexao.getPstmt().   setInt(4, p.getCodCidade().getIdCidade());
    		
    		res = conexao.executeUpdate();
    		
    	}
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
      res = false;
    }
    return(res);
  }
   
  @SuppressWarnings("finally")
  public Pessoa buscar(String nome)
  {
    Pessoa    res  = null;
    CidadeDAO cDAO = null;
    String query = "SELECT idPessoa, "
    		+ "nome, "
    		+ "email, "
    		+ "codCidade"
            + "FROM pessoa WHERE nome LIKE ?";
    
    conexao.preparar(query);
    try
    {
      conexao.getPstmt().setString(1, "%"+nome+"%");
      ResultSet rs = conexao.executeQuery();
      
      cDAO = new CidadeDAO();
      while (rs.next())
      {
        res = new Pessoa();
        res.setIdPessoa(rs.getInt("idPessoa"));
        res.setNome(rs.getString("nome"));
        res.setEmail(rs.getString("email"));
        res.setCodCidade(cDAO.buscarPorID(rs.getInt("codCidade")));
      }
      rs.close();
      
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally
    {
      return(res);
    }
  }
  
  @SuppressWarnings("finally")
  public Pessoa buscarPorID(int idPessoa)
  {
    Pessoa 	  res  = null;
    CidadeDAO cDAO = null;
    String query = "SELECT idPessoa, nome, email, senha, codCidade "
            + "FROM pessoa WHERE idPessoa=?";
    
    conexao.preparar(query);
    try
    {
      conexao.getPstmt().setInt(1, idPessoa);
      ResultSet rs = conexao.executeQuery();
      
      cDAO  = new CidadeDAO();
      while (rs.next())
      {
        res = new Pessoa();
        res.setIdPessoa(idPessoa);
        res.setNome(rs.getString("nome"));
        res.setEmail(rs.getString("email"));
        res.setSenha(rs.getString("senha"));
        res.setCodCidade(cDAO.buscarPorID(rs.getInt("codCidade")));
      }
      rs.close();
      
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally
    {
      return(res);
    }
  }
  
  @SuppressWarnings("finally")
  public boolean buscarPorEmail(String email)
  {
    boolean res = false;
    String query = "SELECT idPessoa, nome, email, codCidade "
            + "FROM pessoa WHERE email=?";
    
    conexao.preparar(query);
    try
    {
      conexao.getPstmt().setString(1, email);
      ResultSet rs = conexao.executeQuery();
      while (rs.next())
      {
        res = true;
      }
      rs.close();
      
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally
    {
      return(res);
    }
  }
  
  @SuppressWarnings("finally")
  public Pessoa buscar(Pessoa p)
  {
    Pessoa 	  res  = null;
    CidadeDAO cDAO = null;
    String query = "SELECT idPessoa, nome, email, codCidade "
            + "FROM pessoa WHERE nome=? AND email=? AND codCidade=?";
    
    conexao.preparar(query);
    try
    {
      conexao.getPstmt().setString(1, p.getNome());
      conexao.getPstmt().setString(2, p.getEmail());
      conexao.getPstmt().setInt(3, p.getCodCidade().getIdCidade());
      ResultSet rs = conexao.executeQuery();
      
      cDAO = new CidadeDAO();
      while (rs.next())
      {
        res = new Pessoa();
        
        res.setIdPessoa(rs.getInt("idPessoa"));
        res.setNome(rs.getString("nome"));
        res.setEmail(rs.getString("email"));
        res.setCodCidade(cDAO.buscarPorID(rs.getInt("codCidade")));
      }
      rs.close();
      
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    finally
    {
      return(res);
    }
  }
  
  public ArrayList<Pessoa> buscarTodos()
  {
    ArrayList<Pessoa> res = new ArrayList<Pessoa>();
    CidadeDAO cDAO = null;
    
    String query = "SELECT idPessoa, "
            + "nome FROM pessoa "
            + "ORDER BY nome";
    
    conexao.preparar(query);
    try
    {
      ResultSet rs = conexao.executeQuery();
      
      cDAO = new CidadeDAO();
      while (rs.next())
      {
        res.add(new Pessoa(rs.getInt("idPessoa"), 
        				   rs.getString("nome"), 
        				   rs.getString("email"), 
        				   rs.getString("senha"), 
        				   cDAO.buscarPorID(rs.getInt("codCidade"))));
      }
      rs.close();
      
    } catch (SQLException ex)
    {
      Logger.getLogger(PessoaDAO.class.getName()).log(Level.SEVERE, null, ex);
    }
    return(res);
  }
}
